package Client;

import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import Both.Billet;
import Both.Passager;
import Both.Trajet;
import Both.Transport;
import Both.TypeBillet;
import Both.Ville;
import Serveur.Reservation;
import Serveur.Serveur;

public class Client {
    private Serveur serveur;
    private Passager passager;

    /**
     * Definition du constructeur normal
     * 
     * @param serveur
     */
    public Client(Serveur serveur, Passager passager) {
        this.serveur = serveur;
        this.passager = passager;
    }

    /**
     * Permet de Faire une demande de reservation aupres du serveur   
     * @param trajets
     *          Liste des trajets que le passager souhaite reserver
     * @param typeBillet
     *          Type de billet reserve
     * @param services
     *          Services souscrits par le passager
     * @param nbPersonne
     *          Nombre de personnes concernees par le billet
     * @return la liste des reservations effectuees
     */
    public ArrayList<Reservation> demandeReservation(ArrayList<Trajet> trajets, TypeBillet typeBillet, HashMap<String, Double> services ,int nbPersonne) {
        // Remplir la liste des reservations
        //
        ArrayList<Reservation> reservations = new ArrayList<Reservation>();
        for(Trajet t : trajets) {
            try {
                reservations.add(new Reservation(t, nbPersonne));
            } catch(RuntimeException e) {
                reservations = null;
                throw new RuntimeException("Un des trajet ne peut pas etre reserve, faute de place. Operation annulee.");
            }
        }

        // Ajouter le billet a la liste des billets du passager ayant reserve
        //
        Billet billet = new Billet(trajets, passager.getProfil(), typeBillet, services, nbPersonne);
        this.passager.ajouterBillet(billet);
        
        return reservations;
    }

    /**
     *  permet de Faire une demande de recherche aupres du serveur.
     * 
     * @param villedep
     * @param villeArr
     * @param dateDep
     * @param dateArr
     * @param traj
     * @param trans
     * @param nbPlace
     * @return
     */
    public DemandeRechercheClient demandeRecherche(Ville villedep,
            Ville villeArr, GregorianCalendar dateDep,
            GregorianCalendar dateArr, Transport trans, int nbPlace) {
        return new DemandeRechercheClient(villedep, villeArr, dateDep, dateArr,
                trans, nbPlace);
    }

    /**
     *  permet de Faire une demande de recherche aupr�s du serveur.
     * 
     * @param villedep
     * @param villeArr
     * @param dateDep
     * @param dateArr
     * @param traj
     * @param trans
     * @param nbPlace
     * @return 
     */
    public DemandeRechercheClient demandeRecherche(Trajet traj, int nbPlace) {
        return new DemandeRechercheClient(traj, nbPlace);
    }

    public void AfficherListeTrajet(ArrayList<Trajet> ListeTrajet) {
        Iterator<Trajet> it = ListeTrajet.iterator();

        System.out.println("Liste des trajets filtres");
        System.out.println("*************************");

        while (it.hasNext()) {
            Trajet current = it.next();
            current.print();
        }

        System.out.println("*************************");
    }
}


